import pytest, re
from playwright.sync_api import Page, sync_playwright, expect

"""
测试断言的使用方法
expect()：断言函数，可接受三个类型的参数
1、Page：页面对象，用于断言页面中的出现的行为
2、Locator：定位器对象，用于断言DOM元素出现的行为
3、APIResponse：http接口响应对象，用于断言接口响应行为
"""


@pytest.fixture
def page():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False, slow_mo=200)
        context = browser.new_context()
        page = context.new_page()
        yield page
        context.close()
        browser.close()


def test_expect_page(page) -> None:

    # 打开https://playwright.dev/网页
    page.goto("https://playwright.dev/python/")

    # 断言标题中是否包含有 ”Playwright“
    # re.compile python中正则表达式
    expect(page).to_have_title(re.compile("Playwright"))

    # 获取”GET STARTED“ 按钮定位器
    button = page.get_by_role("link", name="Get started")

    # 断言按钮上有href属性，这里其实传的是第2种参数：Locator
    expect(button).to_have_attribute("href", "/python/docs/intro")

    # 点击按钮
    button.click()

    # 断言网页路径上是否包含某些内容
    expect(page).to_have_url(re.compile(".*docs/intro"))


def test_expect_locator(page) -> None:
    # 打开百度网页
    page.goto("https://www.baidu.com")

    # 左上角”新闻“超链接按钮
    href = page.get_by_role("link", name="新闻")

    # 验证元素是否可见
    expect(href).to_be_visible()

    # 断言是否包含”新闻“字样
    expect(href).to_contain_text("新闻")


def test_expect_locator2(page) -> None:
    # 打开登录页面
    page.goto("http://127.0.0.1:34009/xxl-job-admin/toLogin")

    # 输入账号密码进行登录
    page.get_by_placeholder("请输入登录账号").click()
    page.get_by_placeholder("请输入登录账号").fill("admin")
    page.get_by_placeholder("请输入登录密码").click()
    page.get_by_placeholder("请输入登录密码").fill("1234567")
    page.get_by_role("button", name="登录").click()

    # 使用xpath方式获取页面弹出框元素
    layer = page.locator('//*[@id="layui-layer1"]')
    # 断言是否可见
    expect(layer).to_be_visible()
    # 断言是否包含文本
    expect(layer).to_contain_text("账号或密码错误")


def test_expect_apiresponse(page) -> None:
    # 发起网络请求
    response = page.request.get("https://www.baidu.com")
    # 断言请求响应是否ok
    expect(response).to_be_ok()

